﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System.Threading.Tasks;

namespace Pittypat.Web
{
    /// <summary>
    /// 处理对功能的 WebSocket 请求。
    /// </summary>
    static class FunctionSocketHandler
    {
        /// <summary>
        /// 异步处理指定的请求。
        /// </summary>
        /// <param name="request">要处理的请求。</param>
        /// <returns>异步任务。</returns>
        internal static async Task ProcessAsync(Request request)
        {
            // 汇报异步操作进度
            var progress = (WebSocketAsyncProgress)request.Progress;
            // 功能信息
            var funcInfo = request.FuncInfo;

            // 设置 funcModel 的参数值
            FunctionHttpHandler.SetupFuncModel(funcInfo.FunctionModel, funcInfo.Meta, funcInfo.Path, request);

            // 异步执行目标功能
            var task = (Task)funcInfo.Method.Invoke(funcInfo.Module, new object[] { funcInfo.FunctionModel, request.Progress });

            // 等待异步操作结束
            await task;

            dynamic dfm = funcInfo.FunctionModel;
            if (dfm.Success)
            {
                // 如果功能 Api 执行成功，则响应功能方法返回的 IJson
                dynamic d = task;
                var result = d.Result as IJson;

                // 检查 100% 这个进度此前是否已经发送，如果还没有发送，则发送 100% 的进度，同时附上 IJson 的值
                if (result != null || progress.LastPercent < 100f)
                {
                    // 发送一个 100%
                    await progress.SendAsync(Message.Create(100f, (string)(@string)dfm.Message, result));
                }
            }
            else
            {
                // 功能 Api 方法执行失败，发送错误消息
                await progress.SendAsync(Message.Create((string)(@string)dfm.Message));
            }
        }
    }
}
